# Лекция: Generics в Java

Generics в Java - это механизм типизации, который позволяет использовать типы (классы и интерфейсы) в качестве параметров.

## Объявление классов и интерфейсов с Generics

```java
class MyClass<T> {
    T value;
}

interface MyInterface<T> {
    T getValue();
}
```

## Использование классов и интерфейсов с Generics

```java
MyClass<String> myClass = new MyClass<>();
myClass.value = "Hello, world!";
```

## Ограничения на Generics

Можно ограничить типы, которые можно использовать в качестве параметров Generics.

```java
class MyClass<T extends MySuperClass> {
    T value;
}
```

---

# Практические задания

1. **Создайте класс `Box` с Generics, который содержит одно поле `value`.** (Сложность: 1/5)
```java
class Box<T> {
    T value;
}
```

2. **Создайте объект класса `Box`, где `value` является типом `Integer`.** (Сложность: 1/5)
```java
Box<Integer> box = new Box<>();
box.value = 123;
```

3. **Создайте класс `Pair` с Generics, который содержит два поля: `first` и `second`.** (Сложность: 2/5)
```java
class Pair<T, U> {
    T first;
    U second;
}
```

4. **Создайте объект класса `Pair`, где `first` является типом `String`, а `second` - типом `Integer`.** (Сложность: 2/5)
```java
Pair<String, Integer> pair = new Pair<>();
pair.first = "Hello";
pair.second = 123;
```

5. **Создайте класс `MyList` с Generics, который содержит список элементов и методы для добавления элемента, возврата элемента по индексу и возврата размера списка.** (Сложность: 3/5)
```java
import java.util.ArrayList;
import java.util.List;

class MyList<T> {
    private List<T> list = new ArrayList<>();

    void add(T item) {
        list.add(item);
    }

    T get(int index) {
        return list.get(index);
    }

    int size() {
        return list.size();
    }
}

MyList<String> myList = new MyList<>();
myList.add("Hello");
myList.add("world!");
System.out.println(myList.get(0));
System.out.println(myList.get(1));
System.out.println(myList.size());
```